/*
 * Copyright (c) 2014 ZePan.Co.Ltd. All rights reserved.
 * 文件名:DynamicImageArea.java
 * 包含类名列表:DynamicImageArea，DynamicImageAreaAdapter
 * 版本号:1.0
 * 创建日期:2014/12/3
 */
package com.bigtotoro.widgets;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.Fragment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;


/**
 * 继承于GridView，用于在界面上展示图片方格，可添加和删除图片。可内嵌于Activity与Fragment布局中，
 * 当系统判断当前为Fragment时，取出图片后返回到
 * {@link Fragment#onActivityResult(int, int, Intent)}
 * 中，当判断当前为Activity时，返回 到
 * {@link Activity#onActivityResult(int, int, Intent)}中。
 * <hr>
 * <strong>注意：</strong><br>
 * 此类只适用于Activity和Fragment
 *
 * @see Activity
 * @see Fragment
 * @see GridView
 * @author zhanlei <br/>
 * @date 2014-12-3
 */
public class MultiImageView extends GridView {

	private static final String TAG = "MultiImageView";

	private Activity mActivity = null;

	private DynamicImageAreaAdapter mAdapter = null;
	
	private int maxImageNum = 5;
	
	public int getMaxImageNum() {
		return maxImageNum;
	}

	public void setMaxImageNum(int maxImageNum) {
		this.maxImageNum = maxImageNum;
	}

	public MultiImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		if(context instanceof Activity){
			mActivity = (Activity)context;
			mAdapter = new DynamicImageAreaAdapter();
			setAdapter(mAdapter);
		}else{
			
		}
	}


	public MultiImageView(Fragment fragment, AttributeSet attrs) {
		super(fragment.getActivity(), attrs);
		if (mActivity == null) {
			Log.e(TAG, "传入的fragment未绑定到activity.");
			return;
		}
		mActivity = fragment.getActivity();
		mAdapter = new DynamicImageAreaAdapter();
		setAdapter(mAdapter);
	}

	/**
	 * 向界面添加一张显示图片
	 * 
	 * @see DynamicImageAreaAdapter#addImage(Bitmap)
	 * @param bitmap
	 *            待显示的图片
	 * */
	public void addImage(Bitmap bitmap) {
		if (bitmap == null) {
			Log.w(TAG, "传入的Bitmap为空");
			return;
		}
		mAdapter.addImage(bitmap);
	}

	public void removeImage(int index){
		mAdapter.removeImage(index);
	}
	
	/**
	 * 返回图片列表 <strong>注意：这里仅返回“显示图片”列表，不返回“加号图片”</strong><br>
	 * 
	 * @return “显示图片”的Bitmap列表
	 * */
	public List<Bitmap> getBitmapList() {
		List<Bitmap> list = new ArrayList<Bitmap>();
		for (Item item : mAdapter.mDataList) {
			// 排除加号图片
			if (!item.isAdd) {
				list.add(item.bitmap);
			}
		}
		return list;
	}

	/**
	 * 继承于BaseAdapter,作为{@link MultiImageView}的适配器
	 * */
	private class DynamicImageAreaAdapter extends BaseAdapter {
		/**
		 * 定义一个{@link Item}列表，并在创建时插入一个"添加Item"。
		 * */
		private List<Item> mDataList = new ArrayList<Item>();

		/**
		 * 无参构造方法，调用此方法创建对象后，会在数据列表{@link #mDataList}中创建一个 “加号图片”
		 * */
		private DynamicImageAreaAdapter() {
			// 创建一个加号图片并添加到显示数据中
			Item item = new Item(BitmapFactory.decodeResource(
					mActivity.getResources(), R.drawable.addbutton), true);
			mDataList.add(item);
			
		}

		/**
		 * 将一个Bitmap添加到显示列表中。为了保证图片显示成一排，最终界面显示的图片数为GridView中规定的 列数。在数据列表
		 * {@link #mDataList}所有添加的图片都将在加号图片前，显示图片（除加号以外的图片）
		 * 的位置与添加顺序对应，添加到最后一张时删除加号图片。
		 * 
		 * @see GridView#getNumColumns()
		 * @param bitmap
		 *            待添加的图像
		 * */
		public void addImage(Bitmap bitmap) {
			if (bitmap == null) {
				return;
			}
			int size = mDataList.size();
			// 如果当前数据列表长度不大于GridView的列数，则添加“显示图片”
			if (size <= maxImageNum) {
				// 创建"显示图片"Item
				Item item = new Item(bitmap, false);
				mDataList.add(size - 1, item);
				// 如果添加后的数据列表长度大于GridView列数，删除“加号图片”
				if (mDataList.size() > maxImageNum) {
					mDataList.remove(mDataList.size() - 1);
				}
			}
			notifyDataSetChanged();
		}

		/**
		 * 删除指定位置的图像
		 * @param index 待删除的位置
		 * */
		public void removeImage(int index){
			mDataList.remove(index);
			//如果删除“显示图片”后，数据列表中无“添加图片”，向数据列表中添加“添加图片”
			boolean hasAdd = false;
			for(Item item : mDataList){
				if(item.isAdd){
					hasAdd = true;
				}
			}
			if(!hasAdd){
				Item item = new Item(BitmapFactory.decodeResource(
						mActivity.getResources(), R.drawable.addbutton), true);
				mDataList.add(item);
			}
			notifyDataSetChanged();
		}
		
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mDataList.size();
		}

		@Override
		public Item getItem(int position) {
			// TODO Auto-generated method stub
			return mDataList.get(position);
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		/**
		 * 定义每张图片的显示方式和点击事件，如“显示图片”点击后跳转到显示界面，“添加图片”点击后 弹出添加图片Dialog
		 * */
		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				holder = new ViewHolder();
				convertView = LayoutInflater.from(mActivity).inflate(
						R.layout.multi_imageview_item, null);
				holder.iv = (ImageView) convertView.findViewById(R.id.icon);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			final Item item = mDataList.get(position);
			holder.iv.setImageBitmap(item.bitmap);
			// 添加点击事件
			holder.iv.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View view) {
					// 如果当前是添加图片
					if (item.isAdd) {
						if(listener!=null){
							listener.onAddBtn(view);
						}
//						addImage(BitmapFactory.decodeResource(
//								mActivity.getResources(), R.drawable.itemicon));
//						notifyDataSetChanged();
					} else {// 如果当前是显示图片
//						Intent intent = new Intent(mActivity, ImageDeleteActivity.class);
//						intent.putExtra("index", position);
//						intent.putExtra("image", item.bitmap);
//						mActivity.startActivityForResult(intent, 100);
					}
				}
			});
			return convertView;
		}

	}

	/** ViewHolder */
	private class ViewHolder {
		ImageView iv = null;
	}

	/**
	 * 根据每个方格内容抽象出来的业务对象。当前方格内图片分为两种，一种是展示图片，一个添加图片。
	 * 展示类图片点击后出现显示和删除页面，添加图片点击后显示添加图片对话框。
	 * */
	private class Item {
		/** 标识当前Item是否是添加类图片 */
		boolean isAdd = false;
		/**
		 * 当前Item显示的Bitmap对象
		 * 
		 * @see Bitmap
		 * */
		Bitmap bitmap = null;

		public Item(Bitmap bitmap, boolean isAdd) {
			this.bitmap = bitmap;
			this.isAdd = isAdd;
		}
	}

	private OnCustomClick listener;
	public void setOnCustomClick(OnCustomClick listener){
		this.listener = listener;
	}
	public interface OnCustomClick{
		public void onAddBtn(View view);
		public void onItemClick(View view);
	}
}
